var name = 'window'
var person1 = {
  name: 'person1',
  foo1: function () {
    console.log(this.name);
  },
  foo2: () => console.log(this.name),
  foo3: function () {
    return function () {
      console.log(this.name);
    }
  },
  foo4: function () {
    return () => {
      console.log(this.name);
    }
  }
}

var person2 = {
  name: 'person2'
}

person1.foo1(); // person1(隐式绑定)
person1.foo1.call(person2) //person2 (显示绑定优先级大于隐式绑定)

person1.foo2(); //window (箭头函数不绑定作用域,找上层作用域:全局)(对象不产生作用域)
person1.foo2.call(person2) // window (箭头函数不受this规则控制)

person1.foo3()() // window (独立函数调用)
person1.foo3.call(person2)() // window (独立函数调用)
person1.foo3().call(person2) // person2 (最终调用返回函数时,使用的是显式绑定)

person1.foo4()() // person1 (箭头函数去上层找作用域,找到的是foo4的作用域,而foo4我们是通过person1隐式调用的)
person1.foo4.call(person2)() // person2 (上层作用域被显式绑定成了person2)
person1.foo4().call(person2) // person1 (上层作用域找到person1)